home *** CD-ROM | disk | FTP | other *** search
/ Cracking 2 / Cracking II..iso / Priklady / Priklad 16 / DETECT16.ASM next >
Assembly Source File  |  2000-08-08  |  7KB  |  143 lines

  1.  
  2. .386
  3. .MODEL FLAT,STDCALL
  4. locals
  5. jumps
  6. UNICODE=0
  7. include w32.inc
  8. include pe.inc
  9.  
  10. Extrn SetUnhandledExceptionFilter : PROC
  11.  
  12. .DATA
  13.  
  14. sprava1        db "Detekcia pomocou VxDCALL volaneho cez Kernel32!ORD_0001",0
  15. sprava3        db "Soft-Ice najdeny",0
  16. sprava2        db "Soft-Ice nenasiel",0
  17. odlozESP       dd 0                             ;sem uklada register ESP
  18. predchadzajuca dd 0                             ;sem uklada adresu predchadzajucej obsluhy SEH
  19. KernelAdress   dd 0                             ;adresa zaciatku (base) KERNEL32 v pamati
  20. a_VxDCall      dd 0                             ;adresa pre volania VxDCall (Kernel32!ORD_0001)
  21.  
  22.  
  23.  
  24. .CODE
  25. Start:
  26.  
  27.  
  28.  
  29.                 mov  ecx,[esp]                  ;do ecx da adresu odkial bol volany (to je vzdy niekde v KERNEL32.DLL)
  30.                 push ecx                        ;ulozi adresu
  31.  
  32. ;----------------------------------------------------------------------------
  33. ;NASTAVI SEH PRE PRIPAD CHYBY
  34. ;----------------------------------------------------------------------------
  35.                 mov  [odlozESP],esp
  36.                 push offset chyba
  37.                 call SetUnhandledExceptionFilter
  38.                 mov  [predchadzajuca], eax
  39. ;----------------------------------------------------------------------------
  40.  
  41.                 pop  ecx                        ;obnovi adresu
  42.  
  43. GetKrnlBaseLoop:                                ;ide hladat zaciatocnu (base) adresu KERNEL32.DLL v pamati
  44.                 xor  edx,edx                    ;nuluje register edx
  45.                 dec  ecx                        ;hlada spatne
  46.                 mov  dx,[ecx+03ch]              ;pokusa sa nacitat z MZ casti hlavicky suboru, start PE hlavicky
  47.                 test dx,0f800h                  ;testuje, ci nasiel spravnu hodnotu
  48.                 jnz  GetKrnlBaseLoop            ;ak nie, skok hladat dalej
  49.                 cmp  ecx,[ecx+edx+34h]          ;porovna aktualnu adresu s adresou, kam tento PE subor (KERNEL32.DLL) mal byt nahraty (jeho Image Base)
  50.                                                 ;zjednodusene povedane testuje, ci nasiel zaciatok KERNEL32.DLL
  51.                 jnz  GetKrnlBaseLoop            ;ak je rozdielna, skoci hladat dalej
  52.  
  53.  
  54.                 mov  [KernelAdress],ecx         ;nasiel zaciatocnu (base) adresu KERNEL32.DLL a ulozi ju
  55.  
  56.                 mov  ebx,ecx                    ;do EBX da zaciatocnu (base) adresu KERNEL32.DLL
  57.  
  58.                 or   ebx,ebx
  59.                 jz   continiue                  ;ak nenasiel zaciatok KERNEL32.DLL, nastala chyba a skoci (ak je EBX=0)
  60.  
  61.                 mov  eax,dword ptr [ebx+3ch]    ;nacita z MZ casti hlavicky suboru, start PE hlavicky
  62.                 add  eax,ebx                    ;nastavi register EAX na start PE hlavicky
  63.  
  64.                 mov  edi,dword ptr [eax+NT_OptionalHeader.      \
  65.                                         OH_DirectoryEntries.    \
  66.                                         DE_Export.              \
  67.                                         DD_VirtualAddress]        ;nacita relativnu virtualnu adresu na Export Table
  68. ;to je vlasne mov  edi,dword ptr [eax+78h]
  69.  
  70.                 add  edi,ebx                    ;nastavi sa na Export Table v KERNEL32.DLL
  71.  
  72.  
  73. ;tu hlada adresu volania Kernel32!ord_0001
  74.  
  75. ;vstupne hodnoty su:
  76. ;ebx = zaciatocna (base) adresa KERNEL32.DLL
  77. ;edi = adresa Export Table v subore KERNEL32.DLL
  78.  
  79.                 mov  esi,dword ptr [edi+ED_AddressOfFunctions]    ;nacita RVA adresu na zoznam exportovanych funkcii
  80. ;to je vlastne  mov esi,dword ptr [edi+1ch]
  81.  
  82.                 add  esi,ebx                    ;nastavi sa na zoznam exportovanych funkcie
  83.                 xor  edx,edx                    ;nuluje register edx (bude pocitadlo)
  84. address_loop:   cmp  edx,dword ptr [edi+ED_NumberOfFunctions]     ;testuje edx (pocitadlo) s poctom exportovanych funkcii a tak zistuje, ci uz testoval vsetky
  85. ;to je vlastne  cmp edx,dword ptr [edi+14h]
  86.                 jae  continiue                  ;ak ano skok, pretoze nenasiel VxDCall (KERNEL32!ORD_0001) a to je chyba
  87.                 mov  ecx,00000008h-01h          ;do registra cx da 7, cize bude 8 krat opakovat
  88. function_loop:  inc  edx                        ;zvisi edx (pocitadlo) o 1
  89.                 lodsd                           ;nacita adresu exportovanej funkcie
  90.                 cmp  eax,dword ptr [esi]        ;testuje, ci je to start PE hlavicky KERNEL32.DLL
  91.                 jne  address_loop               ;ak nie, skok hladat dalej
  92.                 loop function_loop              ;ak ano testuje este sedem krat,
  93.                 add  eax,ebx                    ;v registri eax je RVA adresa pre VxDCall (KERNEL32!ORD_0001) a pripocitanim hodnoty z registra ebx, co je zaciatocna (base) adresa KERNEL32.DLL v pamati sa nastavi na realnu adresu VxDCall
  94.  
  95.  
  96.                 mov  dword ptr [a_VxDCall],eax  ;ulozi adresu pre VxDCall (KERNEL32!ORD_0001)
  97.  
  98.  
  99.  
  100.                                                 ;samotna detekcia Soft-Ice zacina az tu
  101.                 push 0000004fh                  ;funkcia 4fh, ta ista ako v priklade 9
  102.                 push 002a002ah                  ;horne slovo urcuje, ktory typ VxD volania je volany (VWIN32)
  103.                                                 ;dolne slovo urcuje, ktora funkcia je volana (VWIN32_Int41Dispatch)
  104.                 call [a_VxDCall]                ;vola VxdCall (KERNEL32!ORD_0001)
  105.  
  106.                 push eax                        ;ulozi navratovu hodnotu
  107.  
  108. ;----------------------------------------------------------------------------
  109. ;NASTAVI PREDCHADZAJUCU OBSLUHU SEH
  110. ;----------------------------------------------------------------------------
  111.                 push dword ptr [predchadzajuca]
  112.                 call SetUnhandledExceptionFilter
  113. ;----------------------------------------------------------------------------
  114.  
  115.                 pop  eax                        ;obnovi navratovu hodnotu
  116.  
  117.                 cmp  ax, 0f386h                 ;ak je Soft-Ice aktivny v pamati, navratova hodnota je 0f386h
  118.                 jz   skok                       ;a skoci
  119.  
  120.  
  121.  
  122. continiue:
  123.                 call MessageBoxA,0, offset sprava2, offset sprava1,0
  124.                 call ExitProcess, -1
  125.  
  126. skok:
  127.  
  128.                 call MessageBoxA,0, offset sprava3, offset sprava1,0
  129.                 call ExitProcess, -1
  130.  
  131.  
  132.  
  133.  
  134. chyba:                                          ;nova obsluha SEH pre pripad chyby
  135.  
  136.                 mov  esp, [odlozESP]
  137.                 push offset continiue
  138.                 ret
  139.  
  140.  
  141. ends
  142. end Start
  143.